package org.smart4j.framework.helper;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.apache.commons.collections4.CollectionUtils;
import org.smart4j.framework.annotation.Action;
import org.smart4j.framework.bean.Handler;
import org.smart4j.framework.bean.Request;
import org.smart4j.framework.util.ArrayUtil;

/**
 * description: 控制器助手类
 * @version v1.0
 * @author w
 * @date 2018年8月31日下午10:26:59
 */
public class ControllerHelper {
	
	/**
	 * Action Map 用于存放处理请求和处理映射的关系
	 */
	private static final Map<Request,Handler> ACTION_MAP = new HashMap<Request, Handler>();
	
	static{
		// 获取所有 Controller 类
		Set<Class<?>> controllerClassSet = ClassHelper.getControllerClassSet();
		if(CollectionUtils.isNotEmpty(controllerClassSet)){
			for (Class<?> controllerClass : controllerClassSet) {
				// 获取 controllerClass 中所有方法
				Method[] methods = controllerClass.getDeclaredMethods();
				if(ArrayUtil.isNotEmpty(methods)){
					for (Method method : methods) {
						// 判断 method 上是否有 Action 注解
						if(method.isAnnotationPresent(Action.class)){
							Action action = method.getAnnotation(Action.class);
							// 获取映射路径 mapping
							String mapping = action.value();
							// 验证 URL映射规则
							if(mapping.matches("\\w+:/\\w*")){
								String[] array = mapping.split(":");
								if(ArrayUtil.isNotEmpty(array) && array.length == 2){
									// 获取请求方法与请求路径 
									String requestMethod = array[0];
									String requestPath	= array[1];
									Request request = new Request(requestMethod, requestPath);
									Handler handler = new Handler(controllerClass, method);
									ACTION_MAP.put(request, handler);
								}
							}
						}
					}
				}
			}
		}
		
	} // end static
	
	/**
	 * description: 获取 handler 
	 * @param method 请求方法
	 * @param path  请求路径
	 * @return
	 * Handler
	 * @version v1.0
	 * @author w
	 * @date 2018年8月31日 下午10:44:38
	 */
	public static Handler getHandler(String method , String path){
		Request request = new Request(method, path);
		return ACTION_MAP.get(request);
	}
	
}
